#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
	int pipefdTest[2];
	char strBuff[1024] = {0};
	int iCnt = 0;
	int iRet = 0;

	iRet = pipe( pipefdTest );
	if( iRet == -1 )
	{
		perror( "fail pipe in 01_pipe.c" );
		return -1;
	}


//测试 写入 , 读取, 读取阻塞
	memset( strBuff, 0, sizeof(strBuff) );
	strcpy( strBuff, "Hello World" );
	int iRetWrite = write( pipefdTest[1] , strBuff, strlen( strBuff ) );
	if ( iRet == -1 )
	{
		perror( "fail write in 01_pipe.c" );
		return -1;
	}
	printf( "write #%d bytes to pipe\n", iRetWrite );

	char strBuffRead[100] = {0};
	// 1st读取, 读取长度分别设置为 iRetWrite 和 iRetWrite-1
	// 读取长度为 iRetWrite   时, 缓冲区空, 则 2nd读取会阻塞 (如果不关闭 write)
	// 读取长度为 iRetWrite-1 时, 缓冲区还有一个字节, 则 2nd读取1个字节
	int iRetRead = read ( pipefdTest[0], strBuffRead, iRetWrite );  
//	int iRetRead = read ( pipefdTest[0], strBuffRead, iRetWrite - 1 );  
	if ( iRet == -1 )
	{
		perror( "fail read in 01_pipe.c" );
		return -1;
	}
	printf( "1st Read #%d bytes: %s\n", iRet, strBuffRead );

	// 1st读取 iRetWrite 之后, 此时缓冲区为空
	// 关闭   write 时, 2nd读取 直接返回 0
	// 不关闭 write 时, 2nd读取 阻塞 
//	close( pipefdTest[1] );  
	memset( strBuffRead, 0, sizeof(strBuffRead) );
	iRet = read ( pipefdTest[0], strBuffRead, sizeof(strBuffRead) );
	if ( iRet == -1 )
	{
		perror( "fail read in 01_pipe.c" );
		return -1;
	}
	printf( "2nd Read #%d bytes: %s\n", iRet, strBuffRead );
	 
	return 0;
}




/*
pipe()
wirte()
read()
close()

标号0 PipeRead
标号1 PipeWrite

PipeWrite  PipeRead  操作   结果

至少一个	至少一个    写    如果缓存区没有写满, 直接写入
                           如果缓存区已经写满, 阻塞等待直到有数据读出

至少一个    至少一个    读    如果缓存区有数据,   直接读出
                           如果缓存区没有数据, 阻塞等待直到有数据写入

至少一个    0          写    管道立刻破裂, 产生管道破裂信号SIGPIPE, 进程异常结束

0          至少一个    读    如果缓存区有数据, 直接读出
                           如果缓存区没有数据, 不会阻塞等待, 直接返回读到0个数据



*/